#include <iostream>
#include <string>
#include <cstdio>
#include <cerrno>
#include <cstdlib>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>

// void handler(int signum)
// {
//     std::cout << "进程捕捉到了一个信号，信号编号是：" << signum << std::endl;
// }

// int main()
// {
//     // 此处只是调用signal函数，而非handler函数。
//     // 此处仅仅是设置了对2号信号的捕捉方法，并不代表该捕捉方法被调用了
//     // 只有当进程捕捉到2号信号时，signal函数才会调用该方法。
//     signal(2, handler);

//     while(true)
//     {
//         std::cout << "我是一个进程，我的pid是：" << getpid() << std::endl;
//         sleep(1);
//     }
    

//     return 0;
// }

static void Usage(const std::string& proc)
{
    std::cout << "\nUsage：" << proc << " pid signum\n" << std::endl;
}

int cnt = 0;
void catchSignal(int signum)
{
    // std::cout << "获取到一个信号，编号是：" << signum << std::endl;
    std::cout << "运行次数：" << cnt << std::endl;
    alarm(1);// 模拟sleep逻辑
    // sleep(1);
}

// int main(int argc, char* argv[])
int main()
{
    int arr[10];
    arr[100000] = 10;


    // alarm(10);
    // sleep(5);
    // int n = alarm(0);

    // std::cout << n << std::endl;


    // signal(SIGALRM, catchSignal);
    // alarm(1);
    // // int cnt = 0;
    // while(true)
    // {
    //     // std::cout << "cnt: " << cnt++ << std::endl;
    //     cnt++;
    // }

    // ./processname pid signum
    // if(argc != 3)
    // {
    //     Usage(argv[0]);
    //     exit(1);
    // }

    // pid_t pid = atoi(argv[1]);
    // int signum = atoi(argv[2]);

    // int flag = kill(pid, signum);
    // if(flag != 0)
    // {
    //     perror("kill");
    // }

    // int cnt = 0;
    // while(true)
    // {
    //     printf("cnt：%d\n", cnt++);
    //     sleep(1);

    //     // if(cnt >= 5) raise(3);
    //     if(cnt >= 5) abort();
    // }

    // signal(SIGFPE, catchSignal);// 现象，一直调用catchSignal

    // int *p = nullptr;
    // *p = 10;

    // int a = 10;// 除零错误 - Floating point exception  - 8)SIGFPE
    // // OS向进程发送8)SIGFPE信号，终止当前进程
    // a /= 0;
    // // 只发生一次除零错误，但现象是，一直调用catchSignal


    // while(true)
    // {
    //     std::cout << "我在运行中..." <<std::endl;

    //     sleep(1);

    //     // int a = 10;// 除零错误 - Floating point exception  - 8)SIGFPE
    //     // // OS向进程发送8)SIGFPE信号，终止当前进程
    //     // a /= 0;
    // }


    return 0;
}